/**
 * 时间采样实验
 * 
 * 1. 对耗时任务运行的时间进行采样，在控制台输出采样的时间
 * 2. 多运行几次程序，观察同样的耗时任务每次采样的时间是否相同
 */

console.log('=== 时间采样实验 ===\n');

// 1. 使用 console.time() 和 console.timeEnd() 进行时间采样
console.log('1. 使用 console.time() 和 console.timeEnd()：');

// 模拟耗时任务 - 计算斐波那契数列
function fibonacci(n) {
    if (n <= 1) return n;
    return fibonacci(n - 1) + fibonacci(n - 2);
}

console.time('斐波那契计算');
const result1 = fibonacci(35);
console.timeEnd('斐波那契计算');
console.log('结果：', result1);
console.log('');

// 2. 使用 process.hrtime() 进行高精度时间采样
console.log('2. 使用 process.hrtime() 高精度采样：');

const startTime = process.hrtime();
const result2 = fibonacci(35);
const endTime = process.hrtime(startTime);

console.log('斐波那契计算完成');
console.log('耗时：', endTime[0] + '秒', endTime[1] / 1000000 + '毫秒');
console.log('结果：', result2);
console.log('');

// 3. 使用 Date.now() 进行时间采样
console.log('3. 使用 Date.now() 采样：');

const start = Date.now();
const result3 = fibonacci(35);
const end = Date.now();

console.log('斐波那契计算完成');
console.log('耗时：', (end - start) + '毫秒');
console.log('结果：', result3);
console.log('');

// 4. 使用 performance.now() 进行时间采样
console.log('4. 使用 performance.now() 采样：');

const perfStart = performance.now();
const result4 = fibonacci(35);
const perfEnd = performance.now();

console.log('斐波那契计算完成');
console.log('耗时：', (perfEnd - perfStart).toFixed(2) + '毫秒');
console.log('结果：', result4);
console.log('');

// 5. 多次运行观察时间差异
console.log('5. 多次运行观察时间差异：');

for (let i = 1; i <= 3; i++) {
    console.log(`第${i}次运行：`);
    
    const start = Date.now();
    const result = fibonacci(30); // 使用较小的数避免等待太久
    const end = Date.now();
    
    console.log(`  耗时：${end - start}毫秒`);
    console.log(`  结果：${result}`);
}

console.log('');

// 6. 不同复杂度任务的采样对比
console.log('6. 不同复杂度任务的采样对比：');

// 简单任务
console.time('简单任务');
let sum = 0;
for (let i = 0; i < 1000000; i++) {
    sum += i;
}
console.timeEnd('简单任务');
console.log('简单任务结果：', sum);

// 中等复杂度任务
console.time('中等复杂度任务');
const result5 = fibonacci(25);
console.timeEnd('中等复杂度任务');
console.log('中等复杂度任务结果：', result5);

// 复杂任务
console.time('复杂任务');
const result6 = fibonacci(35);
console.timeEnd('复杂任务');
console.log('复杂任务结果：', result6);

console.log('\n=== 实验完成 ===');
console.log('提示：多次运行此程序，观察每次的时间采样结果是否相同');
console.log('影响时间的因素：CPU负载、内存使用、系统调度等');
